package com.shujia.wyh.day19;

import java.util.ArrayList;
import java.util.List;

/*
        创建List集合并向集合中添加不同类型的元素
        需求：遍历集合，如果集合中存在字符串java,就往集合添加一个新的字符串"spark"

        按照我们分析的思路去编写后发现，报错了ConcurrentModificationException，这是为什么呢？
        ConcurrentModificationException：并发修改异常

        分析原因：因为迭代器是依赖于集合而产生的，我们在做这道题的时候，按照思路获取该集合的迭代器对象
        然后去遍历迭代器，但是呢，你在遍历的过程中，还使用了集合本身的方法让集合中的元素发生了改变，但是集合改变了
        迭代器它并不知道元素已经发生修改，所以会报错。

        如何解决呢？
            1、迭代器遍历迭代器修改
            2、集合遍历集合修改
 */
public class ListDemo3 {
    public static void main(String[] args) {
        //创建集合对象
        List list = new ArrayList();

        //向集合中添加元素
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("hadoop");
//        list.add(20);

        //遍历集合
//        Iterator iterator = list.iterator();
//        while (iterator.hasNext()){
//            Object next = iterator.next();
////            System.out.println(next);
//            String s = (String) next; //ClassCastException: java.lang.Integer cannot be cast to java.lang.String
//            System.out.println(s);
//        }

        System.out.println("=======================================");
//        Iterator iterator = list.iterator();
//        //遍历迭代器，获取元素
//        while (iterator.hasNext()){
//            Object next = iterator.next();
//            String s = (String) next;
//            //判断该字符串是否是java
//            if("java".equals(s)){
//                list.add("spark");
//            }
//        }
        System.out.println("======================================");
        //解决方式1：迭代器遍历，迭代器进行修改
//        Iterator iterator = list.iterator();
//        while (iterator.hasNext()){
//            String s = (String) iterator.next();
//            if("java".equals(s)){
//                //用迭代器进行修改
//
//            }
//
//        }
        //由于Iterator中并没有添加元素的方式，通过分析后得出使用ListIterator
//        ListIterator listIterator = list.listIterator();
//        while (listIterator.hasNext()){
//            String s = (String)listIterator.next();
//            if("java".equals(s)){
//                listIterator.add("spark"); //这个方法是紧跟着java后面进行添加的
//            }
//        }
//
//        while (listIterator.hasPrevious()){
//            Object previous = listIterator.previous();
//            System.out.println(previous);
//        }

        System.out.println("=============================================");
        //解决方案2：集合遍历集合修改
        for (int i = 0; i < list.size(); i++) {
            Object o = list.get(i);
            String s = (String) o;
            if("java".equals(s)){
                list.add("spark"); //集合调用添加元素的方法，是在集合末尾处添加的
            }
        }

        System.out.println(list);

    }
}
